package com.ys.homework;

import java.util.Arrays;

/**
 * @author CodeYang
 * @Description 交换整数数组元素
 * @Date 2020/12/11 20:26
 */
public class 交换整数数组元素 {

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        System.out.println("逆序前:" + Arrays.toString(arr));
        reverseArr01(arr);
        reverseArr02(arr);
        reverseArr03(arr);
        System.out.println("逆序后:" + Arrays.toString(arr));

    }

    /**
     * 逆序数组元素:
     * 1 与 arr.length -1交换
     * 2 与 arr.length -2 交换
     * i 与 arr.length -1-i交换
     * 交换次数为 len/2; 无论奇数偶数
     * 交换两个数的值:
     * 1:空杯模型
     * 2:一加两减
     * 3:异或运算
     *
     * @param arr
     */
    private static void reverseArr01(int[] arr) {
        int len = arr.length;
        for (int i = 0; i < len / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[len - 1 - i];
            arr[len - 1 - i] = temp;
        }
    }

    /**
     * 方法二:
     * 实现方案二：使用口诀“一加两减”来实现
     * num1 = num1 + num2; // num1 = 8
     * num2 = num1 - num2; // num2 = 3
     * num1 = num1 - num2; // num1 = 5
     * 逆序数组元素:
     * ----> 核心:
     * 1>i 与 arr.length -1-i交换
     * 2>交换次数为 len/2; 无论奇数偶数
     * 交换数组元素值 一加两减
     *
     * @param arr
     */
    static void reverseArr02(int[] arr) {
        int len = arr.length;
        for (int i = 0; i < len / 2; i++) {

            arr[i] = arr[i] + arr[len - 1 - i];
            arr[len - 1 - i] = arr[i] - arr[len - 1 - i];
            arr[i] = arr[i] - arr[len - 1 - i];
        }
    }

    /**
     * 方法三:
     * 异或位运算
     * 通过^位运算实现交换两个变量的值
     * int num1 = 3, num2 = 5;
     * num1 = num1 ^ num2;  // num1 = 3 ^ 5
     * num2 = num1 ^ num2;  // num2 = 3
     * num1 = num1 ^ num2;  // num1 = 5
     * 逆序数组元素:
     * ----> 核心:
     * 1>i 与 arr.length -1-i交换
     * 2>交换次数为 len/2; 无论奇数偶数
     * 交换数组元素值 一加两减
     *
     * @param arr
     */
    static void reverseArr03(int[] arr) {
        int len = arr.length;
        for (int i = 0; i < len / 2; i++) {

            arr[i] = arr[i] ^ arr[len - 1 - i];
            arr[len - 1 - i] = arr[i] ^ arr[len - 1 - i];
            arr[i] = arr[i] ^ arr[len - 1 - i];
        }
    }


}
